/******************************************************************************
* @file     report_manager.h
* @brief    报告管理器接口声明
* @version  1.0
* @date     2016-12-22
* @author   roger.luo
* 
********************************************************************************
* Copyright(C) 2016
* All rights reserved.
*
*******************************************************************************/
#ifndef _REPORT_MANAGER_H_
#define _REPORT_MANAGER_H_

#include "report_buf.h"
#include <stdbool.h>

typedef report_buf_t report_manager_t;                  /*报告管理器 ---------*/

/*******************************************************************************
 * @brief		初始化环形缓冲区
 * @param[in]   report  - 报告管理器信息 
 * @param[in]   base    - report_manager_t管理的flash基地址(扇区对齐)
 * @param[in]   size    - 整个report_buf_t管理的长度(必须是扇区对齐)
 * @return 	    0 - 执行失败, 非0 - 执行成功
 ******************************************************************************/
int report_manager_init(report_manager_t *report, unsigned int base, unsigned int size);
                        
/*******************************************************************************
 * @brief		写入一条报告项到缓冲区
 * @param[in]   report  - 报告管理器信息 
 * @param[in]   buf     - 数据缓冲区
 * @param[in]   size    - 数据长度
 * @return 	    0 - 执行失败, 非0 - 实际写入长度
 ******************************************************************************/
int report_item_write(report_manager_t *report, void *buf, unsigned int size);

/*******************************************************************************
 * @brief		从缓冲区内尝试读取一条报告(此操作不移除该项)
 * @param[in]   report  -报告管理器信息 
 * @param[in]   buf     - 数据缓冲区
 * @param[in]   size    - 数据长度
 * @return 	    0 - 执行失败, 非0 - 实际读取长度
 ******************************************************************************/
int report_item_peek(report_manager_t *rep, void *buf, unsigned int size, bool is_continue);
/*******************************************************************************
 * @brief		从缓冲区内读取一个数据项,当读取成功后将移除该数据项
 * @param[in]   report  - 报告管理器信息 
 * @param[in]   buf     - 数据缓冲区
 * @param[in]   size    - 数据长度
 * @return 	    0 - 执行失败, 非0 - 执行成功
 * @attention   size 必须>= 当前缓冲区内的数据项长度,否则数据项会被截断 
 ******************************************************************************/
int report_item_read(report_manager_t *report, void *buf, unsigned int size);

/*******************************************************************************
 * @brief		将源缓冲区内的全部报告项全部移动到目标缓冲区内,同时清空源缓冲区
 * @param[in]   des  - 目标报告管理器
 * @param[in]   src  - 源报告管理器
 * @return 	    0  - 执行失败, 非0 - 执行成功
 * @attention   需要保证目标缓冲区充足的空间,否则会执行失败
 ******************************************************************************/
int report_item_move_all(report_manager_t *des, report_manager_t *src);

/*******************************************************************************
 * @brief		将源报告缓冲区内指定个数的报告项移动到目标缓冲区内,同时清除源缓
 *              冲内的数据项
 * @param[in]   des    - 目标报告管理器
 * @param[in]   src    - 源报告管理器
 * @param[in]   count  - 移动的报告项数
 * @return 	    0  - 执行失败, 非0 - 实际移动的项数
 * @attention   需要保证目标缓冲区充足的空间,否则会执行失败
 ******************************************************************************/
int report_item_move(report_manager_t *des, report_manager_t *src, int count);

/*******************************************************************************
 * @brief		将源报告缓冲区内指定个数的报告项移动到目标缓冲区内
 * @param[in]   des    - 目标报告管理器
 * @param[in]   src    - 源报告管理器
 * @param[in]   count  - 移动的报告项数
 * @return 	    0  - 执行失败, 非0 - 实际移动的项数
 * @attention   需要保证目标缓冲区充足的空间,否则会执行失败
 ******************************************************************************/
unsigned int report_item_count(report_manager_t *report);

/*******************************************************************************
 * @brief		获取当前报告缓冲区的剩余空闲空间大小
 * @param[in]   report    - 报告管理器
 * @return 	    报告缓冲区的空闲空间大小
 ******************************************************************************/
unsigned int report_item_space_left(report_manager_t *report);

/*******************************************************************************
 * @brief		清空报告缓冲区
 * @param[in]   report    - 报告管理器
 * @return 	    0 - 执行失败, 非0 - 执行成功
 ******************************************************************************/
int report_item_clear(report_manager_t *report);

/*******************************************************************************
 * @brief		删除指定个数的数据项
 * @param[in]   count - 待移除的数据项个数
 * @return 	    0 - 执行失败, 非0 - 执行成功(并返回实际删除项数)
 ******************************************************************************/
int report_item_delete(report_manager_t *report, int count);
#endif
